package uu.game.majiang.core;

import java.util.Random;

/**
 * 关于{@link Pai}的一些辅助方法
 * 
 * @author uu
 * @see Pai
 * @version 2010-4-23 上午09:52:51
 */
public class Pais {

    private Pais() {
        // Don't let anyone instantiate this class.
    }

    /*
     * 所有随机行为都使用这一个
     */
    private static final Random random = new Random();

    /*
     * 预存汉字数字，方便生成牌名
     */
    private static final char[] ZHONG_WEN_SHU_ZI = {'零','一','二','三','四','五','六','七','八','九'};
    
    /**
     * 得到所有的牌，共144张，按顺序排列。
     * 
     * <pre>
     * <style>table{border-collapse:collapse;}td{border:1px solid green;}.fan{background-color:#BAEB67;}</style>
     * 每张牌的牌号如下：
     *  <table>                                                                                                  
     *  <tr class="fan"><td>一万</td><td>二万</td><td>三万</td><td>四万</td><td>五万</td><td>六万</td><td>七万</td><td>八万</td><td>九万</td></tr>
     *  <tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td></tr>
     *  <tr class="fan"><td>一条</td><td>二条</td><td>三条</td><td>四条</td><td>五条</td><td>六条</td><td>七条</td><td>八条</td><td>九条</td></tr>
     *  <tr><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td></tr>
     *  <tr class="fan"><td>一饼</td><td>二饼</td><td>三饼</td><td>四饼</td><td>五饼</td><td>六饼</td><td>七饼</td><td>八饼</td><td>九饼</td></tr>
     *  <tr><td>31</td><td>32</td><td>33</td><td>34</td><td>35</td><td>36</td><td>37</td><td>38</td><td>39</td></tr>
     *  <tr class="fan"><td>东</td><td>南</td><td>西</td><td>北</td></tr>
     *  <tr><td>41</td><td>42</td><td>43</td><td>44</td></tr>
     *  <tr class="fan"><td>中</td><td>发</td><td>白</td></tr>
     *  <tr><td>51</td><td>52</td><td>53</td></tr>
     *  <tr class="fan"><td>春</td><td>夏</td><td>秋</td><td>冬</td><td>梅</td><td>兰</td><td>竹</td><td>菊</td></tr>
     *  <tr><td>61</td><td>62</td><td>63</td><td>64</td><td>65</td><td>66</td><td>67</td><td>68</td></tr>
     *  </table>
     * </pre>
     * 
     * @return 所有的牌
     */
    public static int[] getAllPai() {
        return Pai.getAllPaiCopy();
    }

    /**
     * 得到洗牌后的全部牌，共144张。
     * 
     * <pre>
     * 每张牌的牌号如下：
     *  <style>table{border-collapse:collapse;}td{border:1px solid green;}.fan{background-color:#BAEB67;}</style>
     *  <table>                                                                                                  
     *  <tr class="fan"><td>一万</td><td>二万</td><td>三万</td><td>四万</td><td>五万</td><td>六万</td><td>七万</td><td>八万</td><td>九万</td></tr>
     *  <tr><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td></tr>
     *  <tr class="fan"><td>一条</td><td>二条</td><td>三条</td><td>四条</td><td>五条</td><td>六条</td><td>七条</td><td>八条</td><td>九条</td></tr>
     *  <tr><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td></tr>
     *  <tr class="fan"><td>一饼</td><td>二饼</td><td>三饼</td><td>四饼</td><td>五饼</td><td>六饼</td><td>七饼</td><td>八饼</td><td>九饼</td></tr>
     *  <tr><td>31</td><td>32</td><td>33</td><td>34</td><td>35</td><td>36</td><td>37</td><td>38</td><td>39</td></tr>
     *  <tr class="fan"><td>东</td><td>南</td><td>西</td><td>北</td></tr>
     *  <tr><td>41</td><td>42</td><td>43</td><td>44</td></tr>
     *  <tr class="fan"><td>中</td><td>发</td><td>白</td></tr>
     *  <tr><td>51</td><td>52</td><td>53</td></tr>
     *  <tr class="fan"><td>春</td><td>夏</td><td>秋</td><td>冬</td><td>梅</td><td>兰</td><td>竹</td><td>菊</td></tr>
     *  <tr><td>61</td><td>62</td><td>63</td><td>64</td><td>65</td><td>66</td><td>67</td><td>68</td></tr>
     *  </table>
     * </pre>
     * 
     * @return 洗牌后的全部牌
     */
    public static int[] xipai() {
        int[] copy = getAllPai();
        int length = copy.length;
        for (int i = length - 1; i >= 0; i--) {
            int j = random.nextInt(i + 1);
            int x = copy[i];
            copy[i] = copy[j];
            copy[j] = x;
        }
        return copy;
    }

    /**
     * 得到某张牌的中文名字，如果是不存在的牌号，返回null
     * 
     * @param paihao
     *            牌号
     * @return 牌名。如果不存在对应牌号，返回null
     */
    public static String getPaiName(int paihao) {
        if (isWan(paihao))
            return ZHONG_WEN_SHU_ZI[paihao % 10] + "万";
        if (isTiao(paihao))
            return ZHONG_WEN_SHU_ZI[paihao % 10] + "条";
        if (isBing(paihao))
            return ZHONG_WEN_SHU_ZI[paihao % 10] + "饼";
        switch (paihao) {
            case 41 : return "东风";
            case 42 : return "南风";
            case 43 : return "西风";
            case 44 : return "北风";

            case 51 : return "红中";
            case 52 : return "发财";
            case 53 : return "白板";

            case 61 : return "春";
            case 62 : return "夏";
            case 63 : return "秋";
            case 64 : return "冬";
            case 65 : return "梅";
            case 66 : return "兰";
            case 67 : return "竹";
            case 68 : return "菊";
        }
        return null;
    }

    /**
     * 判断某张牌是否是万
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是万
     */
    public static boolean isWan(int paihao) {
        return paihao >= 11 && paihao <= 19;
    }

    /**
     * 判断某张牌是否是条
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是条
     */
    public static boolean isTiao(int paihao) {
        return paihao >= 21 && paihao <= 29;
    }

    /**
     * 判断某张牌是否是饼
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是饼
     */
    public static boolean isBing(int paihao) {
        return paihao >= 31 && paihao <= 39;
    }

    /**
     * 判断某张牌是否是风(东南西北)
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是风
     */
    public static boolean isFeng(int paihao) {
        return paihao >= 41 && paihao <= 44;
    }

    /**
     * 判断某张牌是否是箭(中发白)
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是箭
     */
    public static boolean isJian(int paihao) {
        return paihao >= 51 && paihao <= 53;
    }

    /**
     * 判断某张牌是否是花(春夏秋冬梅兰竹菊)
     * 
     * @param paihao
     *            需判断的牌的牌号
     * @return 是否是花
     */
    public static boolean isHua(int paihao) {
        return paihao >= 61 && paihao <= 68;
    }

    /**
     * 判断某个整数是否是一张牌的牌号
     * 
     * @param paihao
     *            需判断的整数
     * @return 是否是一张牌的牌号
     */
    public static boolean isPai(int paihao) {
        return isWan(paihao)  || isTiao(paihao) || isBing(paihao) 
            || isFeng(paihao) || isJian(paihao) || isHua(paihao);
    }
    
    /**
     * 判断某个牌号是否是幺九字牌<br/>
     * <br/>
     * 即是否是 一九、风、箭
     * 
     * @param paihao
     * @return 是否是幺九牌
     */
    public static boolean isYaojiuzi(int paihao) {
        return isYaojiu(paihao) || isFeng(paihao) || isJian(paihao);
    }
    
    /**
     * 判断某个牌号是否是幺九<br/>
     * 
     * @param paihao
     * @return 是否是幺九牌
     */
    public static boolean isYaojiu(int paihao){
        return paihao == 11 || paihao == 19
            || paihao == 21 || paihao == 29
            || paihao == 31 || paihao == 39;
    }

}
